perm filename PICW.SAI[PIC,TOB] blob sn#232266 filedate 1976-08-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	make smaller images from big images
C00004 00003	BEGIN "SCAN_A"
C00009 ENDMK
C⊗;
comment make smaller images from big images;
BEGIN "PICW"

REQUIRE "ABBREV.1D[S1,TOB]" SOURCE_FILE;
REQUIRE "STD.12H[S1,TOB]" SOURCE_FILE;
REQUIRE "STD[S1,TOB]" LOAD_MODULE;



REQUIRE "WINDOW.11I[S1,TOB]" SOURCE_FILE;
REQUIRE "WINDF.10E[S1,TOB]" SOURCE_FILE;
REQUIRE "WINDF[S1,TOB]" LOAD_MODULE;

REQUIRE "PIC.11E[S1,TOB]" SOURCE_FILE;
REQUIRE "PIC[S1,TOB]" LOAD_MODULE;

REQUIRE "SPACE.3H[S1,TOB]" SOURCE_FILE;
REQUIRE "SPACE[S1,TOB]" LOAD_MODULE;
REQUIRE "SPACEA[S1,TOB]" LOAD_MODULE;

REQUIRE "VARIAB.3I[S1,TOB]" SOURCE_FILE;
STRING FILE_NAME;
WINDOW_PTR W;

CREATE_W(W);
FILE_NAME←ASK_STRING(CRLF&"INPUT FILE NAME ");
ASK_PIX(W,"PIC,HE",FILE_NAME&".SU");
ASK_WINDOW(W);
READ_PIX(W);
FILE_NAME←ASK_STRING(CRLF&"OUTPUT FILE NAME? ");
FILE_NAME←FILE_NAME&".SM[PIC,HE]";
OUT_W(W,FILE_NAME);  comment write out a window;
END "PICW";
BEGIN "SCAN_A"
  INTEGER CHANNEL;
  INTEGER COUNT_EDGE;
  INTEGER ARRAY DISK_BLOCK[1:'200];  comment one record;

  INTERNAL PROCEDURE ASK_E;
  WHILE YES("CHANGE EDGE VALUES? ") DO BEGIN "ASK_E"
    MODIFY(NOISE_EDGE);
    DIFF_FRACTION←1.35;
    DIFF←DIFF_FRACTION*(NOISE_EDGE↑2);
    END "ASK_E";

  PROCEDURE WRITE_EDGE;
  BEGIN "WR_EDGE"
  REAL C;  COMMENT CONTRAST;
    REAL PHI; COMMENT ANGLE;
    WORDOUT(CHANNEL,OPX);
    WORDOUT(CHANNEL,OPY);
    PHI←ATAN2(CY,CX);
    WORDOUT(CHANNEL,PHI);
    C←TM+TP;
    WORDOUT(CHANNEL,C);
    COUNT_EDGE←COUNT_EDGE+1;
    END "WR_EDGE";

  PROCEDURE PRINT_OP(SHORT INTEGER X,Y;STRING S);
  BEGIN
    TCRLF;WRITE(X);WRITE(Y);
    WRITE(OPX);WRITE(OPY);
    WRITE(CX);WRITE(CY);
    OUTSTR(CRLF&"	");
    WRITE(OPXM);WRITE(OPYM);WRITE(OPXP);WRITE(OPYP);
    OUTSTR(CRLF&"	");
    WRITE(TM);WRITE(TP);
    WRITE(B);
    OUTSTR(CRLF&"	");
    WRITE(S0SQ);WRITE(N0SQ);
    TCRLF;
    END;

INTERNAL BOOLEAN PROCEDURE APPLY_OP(SHORT INTEGER X,Y,FLAG);
  BEGIN "APPLY"
  BOOLEAN F;
  SHORT REAL V;
  IF FLAG THEN BEGIN TCRLF;WRITE(X);WRITE(Y);END;
  IF F←EJLI(X,Y,0,0)∧¬BCOMP THEN PRINT_OP(X,Y," ");
  IF BCOMP THEN BEGIN 
       WRITE(BCOMP); PRINT_OP(X,Y," ");END;
    IF OPOOB THEN WRITE(OPOOB);
  IF ¬F AND FLAG THEN BEGIN "FAIL"
    IF WEAK THEN WRITE(WEAK);
    IF NOISY THEN WRITE(NOISY);
    IF NEARED THEN WRITE(NEARED);
    END "FAIL";
  RETURN (F);
  END "APPLY";

  INTERNAL PROCEDURE INIT_OP(WINDOW_PTR W;INTEGER BL;
    REFERENCE INTEGER X1,Y1,X2,Y2);
    BEGIN
    INTEGER R_OP; ! radius of operator;
    CONF←.85;
    BITS←BITS_W(W);
    LSIDE←X1W_W(W);FLINE←Y1W_W(W);RSIDE←X2W_W(W);LLINE←Y2W_W(W);
    LINLEN←LINLB_W(W);
    IWID←RSIDE-LSIDE+1;
    TVWORD←XWD(-SIZEB_W(W),LOCB_W(W,BL)-1);
    WRITE(BITS);WRITE(LINLEN);WRITE(IWID);WRITE(SIZEB_W(W));
    WRITE(LOCB_W(W,BL));
    EJINIT;
    R_OP←CIRCLE+2.0;
    X1←LSIDE+R_OP;
    X2←RSIDE-R_OP;
    Y1←FLINE+R_OP;
    Y2←LLINE-R_OP;
    END;

  PROCEDURE TRY_OP(INTEGER X,Y);
    IF EJLI(X,Y,0,0) THEN BEGIN "STORE"
      INTEGER XR,YR;
      XR←OPX+0.5;YR←OPY+0.5; ! find the edge center;
      IF EJLI(XR,YR,0,0) THEN WRITE_EDGE; ! write edges in a file;
      END "STORE";

  ASK_E;

  OPEN_OUT(CHANNEL←GETCHAN,BINARY_FILE,FILE_NAME&".EDG[DAT,TOB]");
    comment write out file named .EDG;
  ARRYOUT(CHANNEL,DISK_BLOCK[1],'200);

  BEGIN "RSCAN" comment raster scan, writing out edges in a file;
    INTEGER Y1,Y2,X1,X2,X,Y;
    Y1←Y1W_W(W);Y2←Y2W_W(W); X1←X1W_W(W);X2←X2W_W(W);
    WRITE(X1);WRITE(X2);WRITE(Y1);WRITE(Y2);
    INIT_OP(W,RED_W,X1,Y1,X2,Y2); ! init edge operator;
    FOR Y←Y1 STEP 2 UNTIL Y2 DO
      FOR X←X1+(Y%2) MOD 2 STEP 2 UNTIL X2 DO TRY_OP(X,Y);
    DISK_BLOCK[1]←CVSIX("EDGE");
    DISK_BLOCK[2]←COUNT_EDGE;
    DISK_BLOCK[3]←X1;
    DISK_BLOCK[4]←X2;
    DISK_BLOCK[5]←Y1;
    DISK_BLOCK[6]←Y2;
    END "RSCAN";
  USETO(CHANNEL,1);
  ARRYOUT(CHANNEL,DISK_BLOCK[1],'200);
  CLOSE(CHANNEL);
  END "SCAN_A";
END;